﻿using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using Studio7i.Dominio;
using Studio7i.Negocio;
using Studio7i.Persistencia;

namespace Studio7i.Pruebas
{
    [TestFixture]
    public class Test3_AdministracionService
    {
        IApplicationContext Spring = null;
        IAdministracionService Service = null;
        Local localCreado = null;
        Sala salaInscrita = null;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // Inicialización del contenedor de objetos de Spring.NET
            Spring = new XmlApplicationContext(
                "assembly://Studio7i/Studio7i/capaPersistencia.xml",
                "assembly://Studio7i/Studio7i/capaNegocio.xml"
                );
            // Obtención de la referencia al objeto "administracionService"
            Service = (IAdministracionService)Spring.GetObject("administracionService");
            // Creación de un local de pruebas
            localCreado = ((ILocalDAO)Spring.GetObject("localDAO_ADO")).Crear(
                new Local() { Nombre = "C41", Direccion = "Monterrico" });
        }
        [Test]
        public void Test1_InscribirSala_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.Codigo, 30, null);
            });
        }
        [Test]
        public void Test2_InscribirSala_Ok()
        {
            // Probamos que no exista error en la inscripción de la sala
            Assert.DoesNotThrow(delegate
            {
                salaInscrita = Service.InscribirSala("E43A Rocks!", localCreado.Codigo, 30, ".NET Students");
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(salaInscrita);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(salaInscrita.Codigo, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(salaInscrita.Nombre, "E43A Rocks!");
            Assert.AreEqual(salaInscrita.Local.Codigo, localCreado.Codigo);
            Assert.AreEqual(salaInscrita.Capacidad, 30);
            Assert.AreEqual(salaInscrita.Caracteristicas, ".NET Students");
        }
        [Test]
        public void Test3_InscribirSala_Repetida()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.Codigo, 30, ".NET Students");
            });
        }
        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            // Eliminamos la sala inscrita
            ((ISalaDAO)Spring.GetObject("salaDAO_EF")).Eliminar(salaInscrita);
            // Eliminamos el local de prueba creado inicialmente
            ((ILocalDAO)Spring.GetObject("localDAO_ADO")).Eliminar(localCreado);
            // Cerramos el contenedor de Spring
            Spring.Dispose();
            Spring = null;
        }
    }
}